import com.sun.org.apache.xerces.internal.impl.xs.SchemaNamespaceSupport;

import java.util.Scanner;

/**
 * Created by John
 * Description: 这是第一个Java程序
 * User: Administrator
 * Date: 2021--09--07
 * Time: 15:00
 */
public class TestJohn {

    //递归求 N 的阶乘
    public static int factorialRecur(int n){
        if(n == 1){
            return 1;
        }
        return n * factorialRecur(n - 1);

    }
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("递归求一个数的阶乘值为： "+factorialRecur(scan.nextInt()));
    }

    //递归求 1 + 2 + 3 + ... + 10
    public static int sumRecursion(int n){
        if(n == 1){
            return 1;
        }
        return n+sumRecursion(n-1);
    }

    //按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4) （递归）
    public static void  printInter(int num){
        if(num >9 ){
            printInter(num / 10);
        }
        System.out.print(num % 10 +" ") ;
    }

    public static void main12(String[] args) {
        Scanner scan = new Scanner(System.in);
        //printInter( scan.nextInt());
        System.out.println("求和得："+sumRecursion(scan.nextInt()));
    }

//写一个递归方法，输入一个非负整数，返回组成它的数字之和
    public static int sumInter(int num){
        if(num < 10){
            return num;
        }
        return num % 10 + sumInter(num / 10);
    }

    public static void main11(String[] args) {
//        System.out.println("移动汉诺塔的步骤：");
//        hanoiTower(3,'A','B','C');
        Scanner scan = new Scanner(System.in);
        System.out.println("输入一个非负数得到的数字和为： "+sumInter( scan.nextInt()));
    }

    //递归求解汉诺塔问题
    public static void hanoiTower(int n, char A,char B, char C){
        int count = 0;
        if(n == 1){
            System.out.println("moveadaa: "+ A +"-->" + C);
        }else {
            hanoiTower(n-1,A,C,B);
            System.out.println("move: "+ A +"-->" + C);
            hanoiTower(n-1,B,A,C);
        }
    }


    //青蛙跳台阶问题
    public static int frogJump(int m){
        if(m == 1){
            return 1;
        }
        if(m == 2){
            return 2;
        }else {
            return frogJump(m - 1) + frogJump(m - 2);
        }
    }

    public static void main10(String[] args) {
        Scanner scan = new Scanner(System.in);
        int m = scan.nextInt();
        //System.out.println(frogJump(m));

        System.out.println(Fibonacci(m));
    }

    //在同一个类中,分别定义求两个整数的方法 和 三个小数之和的方法。 并执行代码，求出结果
    public static int sumInt(int m,int n){
        return (m + n);
    }

    public static double sumDouMix(double m,double n,double x){
        return (m + n + x);
    }

    public static void main9(String[] args) {
        System.out.println(sumInt(15, 27));
        System.out.println(sumDouMix(23.21, 18.57, 27.18));
    }

    //在同一个类中定义多个方法：要求不仅可以求两个整数的最大值，
    // 还可以求两个小数的最大值，以及两个小数和一个整数的大小关系
    public static int maxInt(int m,int n){
        return ((m > n)?m : n);
    }
    public static double maxDouble(double sm,double n){
        return ((sm > n)? sm : n);
    }
    public static double maxDouMix(double m,double n,int x){
        double ret = maxDouble(m, n);
        return (((double) x > ret)? x : ret);
    }

    public static void main8(String[] args) {
        System.out.println(maxInt(15, 27));
        System.out.println(maxDouble(14.23, 19.56));
        System.out.println(maxDouMix(23.21, 18.57, 23));
    }


    //有一组数据，只有一个数字是出现一次，其他是两次，请找出这个数字
    public static int findNum(int[] num){
        int i = 0;
        int j = 0;
        int flag = 0;
        for ( i = 0; i<num.length; i++){
            for( j = 0;j<num.length; j++){
                if(num[i] == num[j] && i != j){
                    flag =1;
                    break;     //2,3,5,2,5
                }

            }
            if(flag != 1 && num[i] != num[j -1 ] ){
                return num[i];
            }
            flag = 0;
        }
        return -1;
    }

    //求斐波那契数列的第n项
    public static int Fibonacci(int n){
        if(n == 1 || n ==2){
            return 1;
        }else {
            return Fibonacci(n-1)+Fibonacci(n-2);
        }
    }

    //实现一个方法 avg, 以数组为参数, 求数组中所有元素的平均值
    public static double avg(int[] array){
        double sum = 0.0;
        double avg = 0;
        for (int i = 0; i< array.length; i++){
            sum += array[i];
        }
        avg = sum / array.length;
        return avg;
    }

    //实现一个方法 sum, 以数组为参数, 求数组所有元素之和
    public static double sum(int[] array){
        int sum = 0;
        for (int i = 0; i< array.length; i++){
            sum += array[i];
        }
        return sum;
    }

    //实现一个方法 transform, 以数组为参数, 循环将数组中的每个元素 乘以 2 , 并设置到对应的数组元素上.
    public static void transform(int[] array){

        for (int i = 0; i< array.length; i++){
            array[i] *= 2;
        }

    }

//实现一个方法 printArray,  打印每个元素的值.
       public static void printArray(int[] array){
        int count = 0;
      for (int i = 0; i< array.length; i++){
              System.out.print(array[i]+" ");
              count ++;
              if(count % 10 == 0)
                  System.out.println();
         }
   }

   //创建方法求两个数的最大值max2，随后再写一个求3个数的最大值的函数max3。
    //要求：在max3这个函数中，调用max2函数，来实现3个数的最大值计算
    public static int max2(int m,int n){
        return ((m > n)?m : n);
    }
    public static int max3(int sm,int n){
        return ((sm > n)? sm : n);
    }

    public static void main7(String[] args) {
        Scanner scan = new Scanner(System.in);
        int m = scan.nextInt();
        int n = scan.nextInt();
        int sm = scan.nextInt();
        System.out.println("三个数中的最大值为： "+max3(max2(m, n), sm));

    }

   //调整数组顺序使得奇数位于偶数之前。调整之后，不关心大小顺序
   public static void main5(String[] args) {
       int[] array = {3,4,45,23,18,55};
        printArray( array);
       System.out.println();
        int left = 0;
        int right = array.length - 1;
      while(left < right){
         while (array[left] % 2 != 0 && left < right){//从前往后找偶数,同时避免全是奇数而越界
             left++;
         }
         while (array[right] % 2 == 0 && left < right){//从后往前找奇数
             right --;
         }

        int tmp = array[left] ;
         array[left] = array[right];
         array[right] = tmp;
      }
      printArray(array);
   }

    //创建一个 int 类型的数组, 元素个数为 100, 并把每个元素依次设置为 1 - 100
    public static void main6(String[] args) {
//        int[] array = {3,4,45,23,13,55};
//        printArray( array);

        int[] array1 = new int[100];
        for (int i =0; i<array1.length; i++){
            array1[i] = i+1;

        }
        printArray(array1);
    }

    public static void main4(String[] args) {
        int[] array = {3,4,45,23,13,55};
        //System.out.println("数组元素的平均值为： "+avg(array));
        System.out.println("原数组为： ");
        for (int i= 0;i < array.length; i++){
            System.out.print(array[i]+" ");
        }
        System.out.println();
        transform(array);
        for (int i= 0;i < array.length; i++){
            System.out.print(array[i]+" ");
        }
    }

    //求 N 的阶乘
    public static void main3(String[] args) {
        Scanner scan = new Scanner(System.in);
        int ret = scan.nextInt();
        int tem = 1;
        for (int i =1; i<= ret;i++){
            tem *= i;
            }
        System.out.println("N的阶乘： "+tem);
        }


    //求1！+2！+3！+4！+........+n!的和
    public static void main2(String[] args) {
        Scanner scan = new Scanner(System.in);
        int ret = scan.nextInt();
        int sum = 0;
        for (int i =1; i<= ret;i++){
            int tem = 1;
            for (int j = 1; j <= i; j++){
                tem *= j;
            }
            sum +=tem;
        }
        System.out.println("阶乘和： "+sum);
    }

    public static void main1(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println(Fibonacci(scan.nextInt()));

        int[] array= {2,3,7,3,5,5,2};
        for (int i= 0;i < array.length; i++){
            System.out.print(array[i]+" ");
        }
//        System.out.println();
//        System.out.println(findNum(array));

    }




}
